package com.ruoyi.business.controller;

import com.alibaba.fastjson2.JSON;
import com.ruoyi.business.domain.enums.GradeLevelEnum;
import com.ruoyi.common.core.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.business.domain.ProjectStandard;
import com.ruoyi.business.service.IProjectStandardService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 项目标准Controller
 * 
 * @author lcz
 * @date 2025-02-23
 */
@ApiIgnore
@RestController
@RequestMapping("/business/projectStandard")
public class ProjectStandardController extends BaseController
{
    @Autowired
    private IProjectStandardService projectStandardService;

    /**
     * 查询项目标准列表
     */
    @ApiOperation(value = "查询项目标准列表")
//    @PreAuthorize("@ss.hasPermi('business:projectStandard:list')")
    @GetMapping("/list")
    public TableDataInfo list(ProjectStandard projectStandard)
    {
        startPage();
        List<ProjectStandard> list = projectStandardService.selectProjectStandardList(projectStandard);
        return getDataTable(list);
    }

    /**
     * 导出项目标准列表
     */
    @ApiOperation("导出项目标准列表")
//    @PreAuthorize("@ss.hasPermi('business:projectStandard:export')")
    @Log(title = "项目标准", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ProjectStandard projectStandard)
    {
        List<ProjectStandard> list = projectStandardService.selectProjectStandardList(projectStandard);
        ExcelUtil<ProjectStandard> util = new ExcelUtil<ProjectStandard>(ProjectStandard.class);
        util.exportExcel(response, list, "项目标准数据");
    }

    /**
     * 获取项目标准详细信息
     */
    @ApiOperation("获取项目标准详细信息")
//    @PreAuthorize("@ss.hasPermi('business:projectStandard:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(projectStandardService.selectProjectStandardById(id));
    }

    /**
     * 新增项目标准
     */
    @ApiOperation("新增项目标准")
//    @PreAuthorize("@ss.hasPermi('business:projectStandard:add')")
    @Log(title = "项目标准", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody ProjectStandard projectStandard)
    {
        if (ObjectUtils.isEmpty(projectStandard.getGradeId())){
            return AjaxResult.error("等级id不能为空");
        }
        if (ObjectUtils.isEmpty(projectStandard.getProjectType())){
            return AjaxResult.error("项目类型不能为空");
        }
        if (ObjectUtils.isEmpty(projectStandard.getSingleScore())){
            return AjaxResult.error("单项得分不能为空");
        }
        return toAjax(projectStandardService.insertProjectStandard(projectStandard));
    }

    /**
     * 修改项目标准
     */
    @ApiOperation("修改项目标准")
//    @PreAuthorize("@ss.hasPermi('business:projectStandard:edit')")
    @Log(title = "项目标准", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody ProjectStandard projectStandard)
    {
        return toAjax(projectStandardService.updateProjectStandard(projectStandard));
    }

    /**
     * 删除项目标准
     */
    @ApiOperation("删除项目标准")
//    @PreAuthorize("@ss.hasPermi('business:projectStandard:remove')")
    @Log(title = "项目标准", businessType = BusinessType.DELETE)
	@DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(projectStandardService.deleteProjectStandardByIds(ids));
    }

    /**
     * 导入接口
     */
    @ApiOperation("后台----导入总项目标准")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) throws Exception {
        InputStream inputStream = file.getInputStream();
        ExcelUtil<ProjectStandard> util = new ExcelUtil<ProjectStandard>(ProjectStandard.class);
        List<ProjectStandard> projectStandardList = util.importExcel(inputStream);
        List<ProjectStandard> dataList = projectStandardService.selectProjectStandardList(new ProjectStandard());
        //TODO: 比较两个列表，以项目类型、性别、单项得分为组合键，找出projectStandardList中有多少数据是dataList中存在的，并返回这些数据的行号

        // 用于存储重复数据的行号
        List<Integer> duplicateRowNumbers = new ArrayList<>();

        try{
            // 创建一个映射，用于快速查找dataList中是否存在相同的组合键
            Map<String, ProjectStandard> existingDataMap = dataList.stream()
                    .collect(Collectors.toMap(
                            ps -> ps.getProjectType() + "-" + ps.getGender() + "-" + ps.getSingleScore()+"-"+ps.getGradeId(),
                            ps -> ps
                    ));

            // 遍历导入的projectStandardList，检查是否存在重复数据
            for (int i = 0; i < projectStandardList.size(); i++) {
                ProjectStandard projectStandard = projectStandardList.get(i);
                String key = projectStandard.getProjectType() + "-" + projectStandard.getGender() + "-" + projectStandard.getSingleScore() + "-" + projectStandard.getGradeId();
                if (existingDataMap.containsKey(key)) {
                    // 如果存在重复，记录行号（注意：Excel行号从1开始，i从0开始，所以需要加2）
                    duplicateRowNumbers.add(i + 2); // 假设第一行为标题行
                }
            }
        }catch (Exception e){
            return AjaxResult.error("导入失败,请检查:项目类型、性别、单项得分 是否为正确值");
        }

        // 如果有重复数据，返回错误信息和重复的行号
        if (!duplicateRowNumbers.isEmpty()) {
            return AjaxResult.error("以下行号的数据已存在：" + duplicateRowNumbers.toString());
        }

        if (projectStandardList.size() > 0){
            for (ProjectStandard projectStandard : projectStandardList){
                projectStandardService.insertProjectStandard(projectStandard);
            }
        }
        return AjaxResult.success();
    }

    /** 前端接口 ***************************************************************************************************/
    /** 前端接口 ***************************************************************************************************/
    /** 前端接口 ***************************************************************************************************/

//    /**
//     * 查询项目标准列表
//     * 接口路径：/projectStandard/front/list
//     */
//    @GetMapping("/front/list")
//    @ApiOperation("前台查询项目标准列表")
//    public TableDataInfo<ProjectStandard> frontList(ProjectStandard projectStandard)
//    {
//        startPage();
//        List<ProjectStandard> list = projectStandardService.selectProjectStandardList(projectStandard);
//        return getDataTable(list);
//    }
//
//    /**
//     * 获取项目标准详细信息
//     * 接口路径：/projectStandard/front/info
//     */
//    @ApiOperation("前台获取项目标准详细信息")
//    @GetMapping(value = "/front/info")
//    public R<ProjectStandard> frontInfo(@RequestParam("id") Long id)
//    {
//        return R.ok(projectStandardService.selectProjectStandardById(id));
//    }
//
//    /**
//     * 新增项目标准
//     * 接口路径：/projectStandard/front/add
//     */
//    @ApiOperation("前台新增项目标准")
//    @PostMapping("/front/add")
//    public AjaxResult frontAdd(@RequestBody ProjectStandard projectStandard)
//    {
//        return toAjax(projectStandardService.insertProjectStandard(projectStandard));
//    }
//
//    /**
//     * 修改项目标准
//     * 接口路径：/projectStandard/front/edit
//     */
//    @ApiOperation("前台修改项目标准")
//    @PostMapping("/front/edit")
//    public AjaxResult frontEdit(@RequestBody ProjectStandard projectStandard)
//    {
//        return toAjax(projectStandardService.updateProjectStandard(projectStandard));
//    }
//
//    /**
//     * 删除项目标准
//     * 接口路径：/projectStandard/front/delete
//     */
//    @ApiOperation("前台删除项目标准")
//    @GetMapping("/front/delete")
//    public AjaxResult frontRemove(@RequestParam Long[] ids)
//    {
//        return toAjax(projectStandardService.deleteProjectStandardByIds(ids));
//    }
}
